From 02ae00123e864a93b4dfbc48b9c2d04a4d131aba Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 19 Oct 2007 14:30:10 +0100 Subject: [PATCH] x86: Fix get_page_from_l1e() and avoid host crash on 'xm save'. Signed-off-by: Keir Fraser --- xen/arch/x86/mm.c | 9 ++++----- xen/common/rangeset.c | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index d25fba7674..76036da607 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -152,7 +152,8 @@ unsigned long total_pages; #define PAGE_CACHE_ATTRS (_PAGE_PAT|_PAGE_PCD|_PAGE_PWT) #define l1_disallow_mask(d) \ - ((rangeset_is_empty((d)->iomem_caps) && \ + ((d != dom_io) && \ + (rangeset_is_empty((d)->iomem_caps) && \ rangeset_is_empty((d)->arch.ioport_caps)) ? \ L1_DISALLOW_MASK : (L1_DISALLOW_MASK & ~PAGE_CACHE_ATTRS)) @@ -619,17 +620,15 @@ get_page_from_l1e( { unsigned long mfn = l1e_get_pfn(l1e); struct page_info *page = mfn_to_page(mfn); - unsigned int disallow_mask; int okay; if ( !(l1e_get_flags(l1e) & _PAGE_PRESENT) ) return 1; - disallow_mask = l1_disallow_mask((d == dom_io) ? current->domain : d); - if ( unlikely(l1e_get_flags(l1e) & disallow_mask) ) + if ( unlikely(l1e_get_flags(l1e) & l1_disallow_mask(d)) ) { MEM_LOG("Bad L1 flags %x", - l1e_get_flags(l1e) & disallow_mask); + l1e_get_flags(l1e) & l1_disallow_mask(d)); return 0; } diff --git a/xen/common/rangeset.c b/xen/common/rangeset.c index 79a09f894e..5c1b73cefe 100644 --- a/xen/common/rangeset.c +++ b/xen/common/rangeset.c @@ -263,7 +263,7 @@ int rangeset_contains_singleton( int rangeset_is_empty( struct rangeset *r) { - return list_empty(&r->range_list); + return ((r == NULL) || list_empty(&r->range_list)); } struct rangeset *rangeset_new( -- 2.30.2